//
// Created by 邹嘉旭 on 2025/8/5.
//

#ifndef ELEMENTS_H
#define ELEMENTS_H

#include <ld_dashboard.h>

#include "ldacs_corenet.h"

#include <ld_net.h>
#include <ld_hashmap.h>
#include <stdatomic.h>
#include <ld_list.h>

typedef struct network_element_s net_element_t;

typedef struct element_propt_s {
    basic_conn_t bc;
    interface_type_t interface_type;
    uint16_t peer_sac;
    struct list_head lpointer; //链表节点
} element_propt_t;

typedef struct meta_service_s {
    interface_type_t interface_type;  // 接口类型
    pthread_t th;
    net_ctx_t ctx; // socket上下文
    net_element_t *net_ele; // 网元对象
    bool is_client; //是否为client的元数据
}meta_service_t;

/**
 * 客户端接口配置
 */
typedef struct client_interface_s {
    meta_service_t meta; // 元结构体，便于在server和client间切换
    char *peer_addr_v6; // 服务端地址
    uint16_t peer_port; // 服务端端口
    uint16_t peer_SAC; //服务端SAC
    const char *local_addr_v6;
    uint16_t local_port; //本地绑定端口
    element_propt_t *propt;
}client_interface_t;

/**
 * 服务端侧接口配置对端
 */
typedef struct element_peer_s {
    uint16_t peer_SAC; // 客户端SAC
    uint16_t peer_port; //客户端端口
    // element_propt_t *propt;
    bool is_connect;
}element_peer_t;

/**
 * 遍历服务端接口配置的对端
 * @param server_intf
 * @param func_field
 */
#define FOREACH_PEERS(server_intf,  func_field) \
do { \
for (int i = 0; i < (server_intf)->peer_count; i++) { \
element_peer_t *peer = &(server_intf)->peers[i]; \
do \
{{func_field}\
}while(0); \
} \
} while (0); \

/**
 * 服务端接口配置
 */
typedef struct server_interface_s {
    meta_service_t meta; // 元结构体，便于在server和client间切换
    uint16_t local_port; // 服务端绑定端口
    size_t peer_count; // 客户端数量
    element_peer_t peers[10]; // 客户端配置
}server_interface_t;

#define INTERFACE_DEFINE_MAX 5
#define INTERFACE_NODE_MAX 10

/**
 * 网元配置
 */
struct network_element_s{
    uint16_t SAC; /* 当前网元SAC */
    element_type_t element_type; /* 当前网元类型 */
    const char *element_tag;
    l_err (*start_func)(struct network_element_s *net_element); /* 网元初始化函数 */
    l_err (*stop_func)(struct network_element_s *net_element); /* 网元销毁函数 */

    size_t client_interface_count; /* 当前网元客户端角色数量 */
    client_interface_t client_interfaces[INTERFACE_DEFINE_MAX];

    size_t server_interface_count; /* 当前网元服务器角色数量 */
    server_interface_t server_interfaces[INTERFACE_DEFINE_MAX];

    pthread_t th;
    atomic_int exit_flag;

    meta_service_t *meta_map[INTERFACE_NODE_MAX];   //用于记录不同interface下的node
    struct hashmap *as_map; //记录当前连接的AS

    //做一个propt的list，propt里有属性
    element_propt_t propts;
    struct list_head *propt_head;

    void *inline_element; //内联网元属性，扩展不同网元具备的功能

     dashboard_obj_t dashboard_obj;
};


extern net_element_t elements[];
extern size_t elements_count;

l_err init_element_service(net_element_t *net_ele, recv_handler server_handler, recv_handler client_handler);

l_err destroy_element_service(net_element_t *net_ele);

element_propt_t *get_propt(net_element_t *net_ele, interface_type_t type, uint16_t peer_SAC);

element_propt_t *get_propt_by_ip_port(net_element_t *net_ele, interface_type_t type, char *peer_IP, uint16_t port);

client_interface_t *get_client_interface(net_element_t *net_ele, element_type_t type);

net_element_t *get_element_by_tag(element_type_t type, const char *tag);

net_element_t *get_element_by_SAC(uint16_t SAC);



#endif //ELEMENTS_H
